<template>
  <div class="p-checkbox-group">
    <div
      class="u-item"
      v-for="item in list"
      :class="{
        'u-actived':
          modelValue && modelValue.length > 0
            ? modelValue.indexOf(item[valueKey]) >= 0
            : item[valueKey] === valueOfAll,
      }"
      @click="() => clickItem(item[valueKey])"
    >
      {{ item.label }}
    </div>
  </div>
</template>

<script setup name="CheckboxGroup">
/**
 * 使用：
 * <CheckboxGroup valueOfAll="全部" :list="radioList" v-model="radioValue"></CheckboxGroup>
 */
const props = defineProps({
  // 当前选中的值的数组
  modelValue: {
    type: Array,
    default: () => [],
  },
  // 选项列表，格式为[{ label: string, value: any }]
  list: Array,
  // “全部”对应的值，与其他项互斥，什么都不选时会高亮此项
  valueOfAll: [String, Number, Boolean],
  // value对应的key，当选项没有value时，可指定value为label
  valueKey: {
    type: String,
    default: 'value',
  },
})

const emit = defineEmits(['update:modelValue', 'change'])

// 点击选项
function clickItem(v) {
  const { modelValue, valueOfAll } = props
  let newArr = modelValue ? modelValue.slice() : []
  if (valueOfAll === v) {
    // 点击“全部”
    newArr = []
  } else if (newArr.indexOf(v) >= 0) {
    // 点击已选中的
    newArr.splice(newArr.indexOf(v), 1)
  } else {
    // 点击未选中的
    newArr.push(v)
  }
  emit('update:modelValue', newArr)
  emit('change', newArr)
}
</script>

<style lang="scss" scoped>
.p-checkbox-group {
  display: flex;
  flex-wrap: wrap;
  .u-item {
    // element表单项行高32px，所以这里增加了上下边距
    margin: 5px 12px 5px 0;
    padding: 0 8px;
    line-height: 22px;
    font-size: 14px;
    color: #000;
    border-radius: 2px;
    cursor: pointer;
    &.u-actived {
      background-color: rgba(59, 104, 240, 0.1);
      color: #3b68f0;
    }
  }
}
</style>
